#include "MarketingForm.h"
#include  <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QList>
#include <QString>
#include <QFile>
#define DRIVER "QSQLITE"
#define DATABASE "./media.db"
#define HOST ""
#define USER ""
#define PASSWORD ""

#define FAKTURA 1
#define CD 2
#define PRZELEW 4
#define KURIER 16
#define POCZTA 32
#define FTP 64
#define POBRANIE 128



MarketingForm::MarketingForm(QWidget *parent):QDialog(parent){
	parent->hide();
	setupUi(this);
	connect(zamowieniaTableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(rowActivate(int,int)));
	connect(zrealizujButton,SIGNAL(clicked()),this,SLOT(zrealizuj()));
	connect(zatwierdzButton,SIGNAL(clicked()),this,SLOT(zatwierdz()));
	connect(productsTableWidget,SIGNAL(itemChanged(QTableWidgetItem *)),this,SLOT(checkValue(QTableWidgetItem*)));

	QStringList temp,temp2;
	temp<< "ID-zam" << "Dostawa"  <<"Nosnik" << "Oplata" << "Faktura" << "Wartosc";
	zamowieniaTableWidget->setColumnCount(6);
	zamowieniaTableWidget->setRowCount(10);
	zamowieniaTableWidget->setHorizontalHeaderLabels(temp);

	temp2<<"Nr produktu"<<"Nazwa"<<"Rozmiar"<<"Cena"<< "Nr promocji"<<"Znizka";
	productsTableWidget->setColumnCount(6);
	productsTableWidget->setRowCount(10);
	productsTableWidget->setHorizontalHeaderLabels(temp2);


		db = QSqlDatabase::addDatabase( DRIVER );
    	db.setDatabaseName( DATABASE );
	    db.setUserName( USER );
	    db.setPassword( PASSWORD );
	    db.setHostName( HOST );
	

	if 	(!db.open()) {printf("Nie udało się otworzyć bazy danych");
			return ;
	}
	else printf("Połączono się z bazą\n");

	readZamowienia();
	readPromocje();

}

MarketingForm::~MarketingForm(){

		db.close();
}

void MarketingForm::readZamowienia(){

	QSqlQuery query;
	query.exec("SELECT COUNT(*) FROM zamowienia");
	query.first();
	QString string;
	int row=query.value(0).toInt();
	zamowieniaTableWidget->setRowCount(row);

	query.exec("SELECT * FROM zamowienia");
row=0;
	while (query.next()){

			int id=query.value(0).toInt();
			int flaga=query.value(1).toInt();
			double cena=query.value(3).toDouble();

		QTableWidgetItem *item=new QTableWidgetItem[6];

		item[0].setText(QString::number(id));
		zamowieniaTableWidget->setItem(row,0,&item[0]);
		
		if (flaga & KURIER)	string="KURIER";
		else if(flaga & POCZTA)	string="POCZTA";
		else if(flaga & FTP) string="FTP";
				item[1].setText(string);
				zamowieniaTableWidget->setItem(row,1,&item[1]);

		if (flaga & CD) string="CD";
		else string="DVD";
				item[2].setText(string);
				zamowieniaTableWidget->setItem(row,2,&item[2]);

		if (flaga & PRZELEW) string="PRZELEWEM";
		else string="ZA POBRANIEM";
				item[3].setText(string);
				zamowieniaTableWidget->setItem(row,3,&item[3]);

		if (flaga & FAKTURA) string="TAK";
		else string="NIE";
			item[4].setText(string);
			zamowieniaTableWidget->setItem(row,4,&item[4]);

		item[5].setText(QString::number(cena));
		zamowieniaTableWidget->setItem(row,5,&item[5]);
	row++;
	}
}


void MarketingForm::readPromocje(){

	QSqlQuery query(db);
	query.exec("Select count(*) from produkty");
	query.first();
	int row =query.value(0).toInt();
	productsTableWidget->setRowCount(row);

	query.exec("Select p.nrp, p.nazwa, p.rozmiar, p.cena, pr.nrpr, pr.znizka from produkty p LEFT OUTER JOIN promocje pr ON pr.nrp=p.nrp");
	QString nazwa;
	QTableWidgetItem *item;
	int znizka,nrp,nrpr;
	double rozmiar,cena;
	row=0;
	Qt::ItemFlags flags;
	while (query.next()){
		nrp=query.value(0).toInt();
		nazwa=query.value(1).toString();
		rozmiar=query.value(2).toDouble();
		cena=query.value(3).toDouble();
		if (query.value(4).isNull()) nrpr=-1;
		else nrpr=query.value(4).toInt();
		if (query.value(5).isNull()) znizka=0;
		else znizka=query.value(5).toInt();

		item=productsTableWidget->item(row,0);
		if (!item) item=new QTableWidgetItem;
		item->setText(QString::number(nrp));
		flags=item->flags();
		flags&=(~Qt::ItemIsEditable);	//zablokuj możliwość edycji
		item->setFlags(flags);
		productsTableWidget->setItem(row,0,item);
	

		
		item=productsTableWidget->item(row,1);
		if (!item) item=new QTableWidgetItem;
		item->setText(nazwa);
		flags=item->flags();
		flags&=(~Qt::ItemIsEditable);
		item->setFlags(flags);
		productsTableWidget->setItem(row,1,item);

		item=productsTableWidget->item(row,2);
		if (!item) item=new QTableWidgetItem;
		item->setText(QString::number(rozmiar));
		flags=item->flags();
		flags&=(~Qt::ItemIsEditable);
		item->setFlags(flags);
		productsTableWidget->setItem(row,2,item);

		item=productsTableWidget->item(row,3);
		if (!item) item=new QTableWidgetItem;
		item->setText(QString::number(cena));
		item->setData(Qt::UserRole,cena);	//zapamiętanie wartości aby sprawdzić czy użytkownik zmienił ją
		productsTableWidget->setItem(row,3,item);
		
		item=productsTableWidget->item(row,4);
		if (!item) item=new QTableWidgetItem;
		if (nrpr==-1) item->setText("");
		
		else item->setText(QString::number(nrpr));
		item->setData(Qt::UserRole,nrpr);		//jeśli nie było promcji w bazie to trzeba to zapamiętać(jeśli -1)

		flags=item->flags();
		flags&=(~Qt::ItemIsEditable);
		item->setFlags(flags);
		productsTableWidget->setItem(row,4,item);



		item=productsTableWidget->item(row,5);
		if (!item) item=new QTableWidgetItem;
		item->setText(QString::number(znizka));
		item->setData(Qt::UserRole,znizka);	//zapamiętanie poprzedniej wartośći( aby zweryfikować czy się zmieniła)
		productsTableWidget->setItem(row,5,item);
	row++;
	}
}


void MarketingForm::rowActivate(int row,int column){
		//odznaczenie zaznaczonych komórek
	QList<QTableWidgetItem *> selected=zamowieniaTableWidget->selectedItems();
	for (QList<QTableWidgetItem *>::iterator it=selected.begin();it!=selected.end();it++){
			if (!(*it)) (*it)=new QTableWidgetItem;
		if(row==(*it)->row())	continue; 
		(*it)->setSelected(false);
	}


	QTableWidgetItem *item;
	for (int i=0;i<zamowieniaTableWidget->columnCount();i++) {
		item=zamowieniaTableWidget->item(row,i);
		if(!item) item=new QTableWidgetItem;
		item->setSelected(true);	
		
		if (i==0) nrz=item->text().toInt();
		else if(i==1) dostawa=item->text();
		else if (i==2) nosnik=item->text();
		else if (i==3) oplata=item->text();
		else if (i==4) faktura=item->text();
		else if (i==5) wartosc=item->text().toDouble();

	}

//wyswietlenie informacji o zamówieniu

	QSqlQuery query(db);
	query.prepare("Select nrk, imie, nazwisko, ulica, kod, miasto, email from KLIENCI where nrk=(Select z.nrk from zamowienia z where z.nrz=:nrz)");
		query.bindValue(":nrz",nrz);
	query.exec();


	QString nazwisko,mail,adres,plik;
	mail="E-mail: ";
	adres="Adres: ";
	if(query.first()){
		nrk=query.value(0).toInt();
		nazwisko=query.value(1).toString() + query.value(2).toString() + "\n";
		adres+=query.value(3).toString() + "\n" + query.value(4).toString() + "," + query.value(5).toString() +"\n";
		mail+=query.value(6).toString() + "\n";
		plik=QString::number(nrk) + "_" + QString::number(nrz) + ".txt";
	infoLabel->setText(nazwisko + adres + mail + "\n zamówienie w pliku  " + plik);
	}

}
void MarketingForm::zrealizuj(){
	QSqlQuery query(db);
	query.prepare("Select nazwa from produkty where nrp IN (Select k.nrp from kupione k where k.nrz=:nrz and k.nrk=:nrk)");
		query.bindValue(":nrz",nrz);
		query.bindValue(":nrk",nrk);
	query.exec();
	QString nazwa;
	while (query.next())	//tworzenie listy produktów
			nazwa+=query.value(0).toString() + "\n";



//wpisanie do pliku
	QTableWidgetItem *item;
	QString temp;
	QFile file(QString::number(nrz)+"_"+QString::number(nrk)+ ".txt");
		file.open(QIODevice::WriteOnly);
	
	//zapisanie szczegółów tranzakcji
		item=zamowieniaTableWidget->horizontalHeaderItem(0);
		if (item) temp=item->text() + QString::number(nrz) + "\n";

		item=zamowieniaTableWidget->horizontalHeaderItem(1);
		if (item) temp+=item->text() + dostawa + "\n";

		item=zamowieniaTableWidget->horizontalHeaderItem(2);
		if (item) temp+=item->text() + nosnik + "\n";

		item=zamowieniaTableWidget->horizontalHeaderItem(3);
		if (item) temp+=item->text() + oplata + "\n";

		item=zamowieniaTableWidget->horizontalHeaderItem(4);
		if (item) temp+=item->text() + faktura + "\n";

		item=zamowieniaTableWidget->horizontalHeaderItem(5);
		if (item) temp+=item->text() + QString::number(wartosc) + "\n";
		file.write(temp.toAscii(),temp.length());	//zapisanie informacji z tabeli


		file.write(infoLabel->text().toAscii(),infoLabel->text().length());	//zapisanie informacji o kupującym
		file.write(nazwa.toAscii(),nazwa.length());							//zapisanie listy kupionych produktów
		file.close();

//usunięcie wpisu z tabeli zamowienia i kupione
	query.prepare("Delete from zamowienia where nrz=:nrz");
		query.bindValue(":nrz",nrz);
		query.exec();
	query.prepare("Delete from kupione where nrz=:nrz and nrk=:nrk");
		query.bindValue(":nrz",nrz);
		query.bindValue(":nrk",nrk);
		query.exec();
	readZamowienia();
}

void MarketingForm::zatwierdz(){
int nrpr,nrpr2,nrp,znizka,znizka2;
double cena,cena2;
QTableWidgetItem *item;
QSqlQuery query;
	for (int i=0; i<productsTableWidget->rowCount();i++){
		item=productsTableWidget->item (i,0);
		if (item) nrp=item->text().toInt();
		
		item=productsTableWidget->item(i,3);
		if (item) {cena=item->text().toDouble(); cena2=item->data(Qt::UserRole).toDouble();}

		item=productsTableWidget->item(i,4);
		if (item) {nrpr=item->text().toInt(); nrpr2=item->data(Qt::UserRole).toInt();}
		//odczytanie nr promocji z ukrytego pola( tej właściwej odróżniającej 0 od braku promocji)

		item=productsTableWidget->item(i,5);
		if (item) {znizka=item->text().toInt(); znizka2=item->data(Qt::UserRole).toInt();}

		if (cena!=cena2){//uaktualniam cenę produktu
				query.prepare("UPDATE produkty SET cena=:cena where nrp=:nrp");
					query.bindValue(":cena",cena);
					query.bindValue(":nrp",nrp);
					query.exec();
		}
		if (znizka!=znizka2){//uaktualniam promocje (jeśli uzytkownik zmenił pole znizka)
			if (nrpr2==-1 && znizka){	//wprowadza nową promocje
				query.exec("Select max(nrpr) from promocje");//największy indeks
					query.first();
					nrpr=query.value(0).toInt()+1;
					printf("elo ziomek nrpr2 %d  nrpr%d   znizka%d\n",nrpr2,nrpr,znizka);

				query.prepare("INSERT into promocje (nrpr,nrp,znizka) values (:nrpr,:nrp,:znizka)");
					query.bindValue(":nrpr",nrpr);
					query.bindValue(":nrp",nrp);
					query.bindValue(":znizka",znizka);
					query.exec();

			}
			else if (nrpr2>=0){			//uaktualniam promocje
				query.prepare("UPDATE promocje SET znizka=:znizka where nrpr=:nrpr");
					query.bindValue(":znizka",znizka);
					query.bindValue(":nrpr",nrpr);
					query.exec();
			}
		}
}
}


void MarketingForm::checkValue(QTableWidgetItem* item){
	if (item->column()==3){
	if (item->text().toDouble()<=0) item->setText("1");
	}

	if (item->column()==5) {
			if (item->text().toInt()>100) item ->setText("99");
			else if(item->text().toInt()<0) item->setText("0");
	}

}
